Hello, 我是 Weber,一位 RoR 工程師,斜槓鼓手與行銷顧問。
每日一套件第 27 天,跟著我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!
今天要講的常用套件是 FactoryBot,它的前身是 FactoryGirl。據說是因為某種政治正確的原因,而被迫改名為中性的Bot,不過這不是重點。這個套件的功能很單純,其實跟先前講的 Faker 目的有點類似,但功能不太一樣,主要是讓使用者簡單產生測試用的物件資料。
起手式~記得要裝的是 rails 版的
$ bundle add factory_bot_rails
然後放在 group :development, :test do
底下
如果你有用 RSpec,可以在 spec/rails_helper.rb
中加入設定:
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
首先,我們要先在 factories 的目錄中建立一個工廠。
假設我們有一個 User
model,我們就先建一個 user 的工廠,在factories/user.rb
設定預設的屬性和狀態,工廠就可以開始運轉啦!!
FactoryBot.define do
factory :user do
name { 'Weber' }
email { 'weber@example.com' }
end
end
有一點要特別注意,不要在 unique 的欄位直接賦值,如下錯誤示範:
FactoryBot.define do
factory :user do
first_name "Weber"
last_name "Chen"
id_number 'A001' #unique 欄位
end
end
在測試中,可以使用 FactoryBot 創造物件實體。
例如,在RSpec測試spec/models/user_spec.rb
中,我們使用 FactoryBot.create(:user) 建造一個 User
實體,然後進行測試,如下:
RSpec.describe User, type: :model do
it 'is valid with valid attributes' do
user = FactoryBot.create(:user)
expect(user).to be_valid
end
end
既然是你的工廠,應該就要滿足你各種不同的測試需求。例如可以這樣做:
user = FactoryBot.create(:user, name: 'Alice', email: 'alice@example.com')
FactoryBot + Faker = 自動產生範例物件 + 不用想命名
FactoryBot.define do
factory :user do
first_name "Weber"
last_name "Chen"
phone_number { Faker::PhoneNumber.phone_number }
end
end
超方便的應用,大家可以自己試試看。不過要注意,Faker
的數量是有限的喔,如果要產生的內容太多,可能會有寫入錯誤的產生。總之多嘗試吧!
我們明天見!